/*
base64 不是加密解密（加密需要对应的秘钥解密） 只是一种编码
它可以编码任何东西(是基于二进制的), 不用非得是文件, 不用非得是字符串
用它的好处在于方便传输, 比如中文如果直接用在前后端的http header里可能会出现乱码问题,
So我们可以把它转成base64
再比如可以把图片也转成base64内嵌, 以减少请求

---

一个汉字3个字节，24位

base64就是将 3*8 转成  4*6
utf8的第一个字节取6位然后在最左边补两个0 组成base64的第一个字节
utf8的第一个字节剩下的2位再加上第二个字节的前4位 组成base64的第二个字节
...以此类推

Base64是网络上最常见的用于传输8Bit字节码的编码方式之一

Base64就是一种基于64个可打印字符来表示二进制数据的方法(1个字节(8位)只有后6位有效，即共计64种状态)

Base64要求把每三个8Bit的字节转换为四个6Bit的字节（38 = 46 = 24），然后把6Bit再添两位高位0，组成四个8Bit的字节
+ 前两位一定是00，即每个新的字节最大不会超过63(2**6-1)
*/

let r = Buffer.from('珠');
console.log(r); // e7 8f a0

console.log(0xe7.toString(2)); //111001 11
console.log(0x8f.toString(2)); //1000 1111
console.log(0xa0.toString(2)); //10 100000

// 00111001 00111000 00111110 00100000  bas64编码后会比之前更大
// 会比以前大1/3

console.log(parseInt('00111001', 2));//57
console.log(parseInt('00111000', 2));//56
console.log(parseInt('00111110', 2));//62
console.log(parseInt('00100000', 2));//32

// const CHARTS = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/';
let str = 'ABCDEFGHIJKLMNOPQRSTUVWXYZ'; // 26个大写的英文字母
str += str.toLowerCase(); // 26个小写的英文字母
str += '0123456789+/'; //10个数字 + '+'和'/'
//↑ 一共64个字符
console.log(str);

/** base64编码*/
console.log('str[57]+str[56]+str[62]+str[32]:',str[57]+str[56]+str[62]+str[32]); // 54+g
console.log('Buffer.from(\'珠\',\'utf-8\').toString(\'base64\'):',Buffer.from('珠','utf-8').toString('base64'));

/** base64解码*/
console.log(Buffer.from('54+g','base64').toString('utf-8')); //珠


// BASE64 可以编码图片，这样能减少http请求(虽然可能会增大原数据体积)
/*
// Base64 在CSS中的使用
.box{
  background-image: url("...");
}
// Base64 在HTML中的使用
<img src="..." />
*/


//其它作用
/*
Base64编码的主要的作用不在于安全性，而在于让内容能在各个网关间无错的传输，这才是Base64编码的核心作用。

在计算机中任何数据都是按ascii码存储的，而ascii码的128～255之间的值是不可见字符(最大127)。而在网络上交换数据时，比如说从A地传到B地，往往要经过多个路由设备，由于不同的设备对字符的处理方式有一些不同，这样那些不可见字符就有可能被处理错误，这是不利于传输的。所以就先把数据先做一个Base64编码，统统变成可见字符，这样出错的可能性就大降低了。
*/
